package nb.diskfilesystem;

import javafx.scene.control.TreeItem;

import java.util.ArrayList;
import java.util.List;

public class DirectoryTreeBuilder {

    public static Directory_Node rootDirectory_Node = new Directory_Node();     //树的根节点

    public static TreeItem<String> buildDirectoryTree() {
        // 初始化根节点的关键属性
        rootDirectory_Node.setAttribute((byte) 8);  // 设置为目录类型
        rootDirectory_Node.setStartBlock((byte) 2); // 设置起始块号为2
        rootDirectory_Node.setFile_Name("C盘".getBytes()); // 设置文件名

        // 构建目录树并显示在 TreeView 上
        rootDirectory_Node = DiskManage.buildDirectoryTree(2, rootDirectory_Node);
        DiskManage.printDirectoryTree(rootDirectory_Node, 0);

        // 创建 C盘 作为根节点
        TreeItem<String> cDrive = new TreeItem<>("C盘");
        cDrive.setExpanded(true); // 只保持根节点展开

        // 将根目录的子节点添加到 C盘 下
        if (rootDirectory_Node.getChildrens() != null) {
            for (Directory_Node child : rootDirectory_Node.getChildrens()) {
                // 只添加文件夹类型的节点
                if (child.getAttribute() == 8) {
                    TreeItem<String> childItem = buildTreeView(child);
                    cDrive.getChildren().add(childItem);
                }
            }
        }
        return cDrive;
    }

    // 修改递归构建 TreeView 的方法
    private static TreeItem<String> buildTreeView(Directory_Node node) {
        // 将 byte[] 的前三个字节转换为字符串作为文件名
        String fileName = new String(node.getFile_Name(), 0, 3).trim();

        // 创建当前节点的 TreeItem
        TreeItem<String> treeItem = new TreeItem<>(fileName);

        // 如果是目录，递归添加子节点
        if (node.getAttribute() == 8) {
            List<Directory_Node> children = node.getChildrens();
            if (children != null) {
                for (Directory_Node child : children) {
                    // 只添加文件夹类型的子节点
                    if (child.getAttribute() == 8) {
                        treeItem.getChildren().add(buildTreeView(child));
                    }
                }
            }
        }
        return treeItem;
    }

    //获取所给的所有文件及文件夹形成一个列表
    public static List<String> getFilesInDirectory(String filePath) {
        List<String> files = new ArrayList<>();
        String[] pathParts = filePath.split("\\\\");
        Directory_Node currentNode = rootDirectory_Node;

        // 遍历路径部分，找到对应的目录节点
        for (String part : pathParts) {
            if (part.equals("C盘")) {
                continue; // 跳过根节点
            }
            boolean found = false;
            if (currentNode.getChildrens() != null) {
                for (Directory_Node child : currentNode.getChildrens()) {
                    if (new String(child.getFile_Name(), 0, 3).trim().equals(part)) {
                        currentNode = child;
                        found = true;
                        break;
                    }
                }
            }
            if (!found) {
                return files; // 如果路径无效，返回空列表
            }
        }
        // 获取当前目录节点下的所有文件
        if (currentNode.getChildrens() != null) {
            for (Directory_Node child : currentNode.getChildrens()) {
                files.add(new String(child.getFile_Name(), 0, 3).trim());
            }
        }

        // 打印文件列表
        System.out.println("文件列表: " + files);
        return files;
    }

    //根据文件路径和名字获取子节点
    public static Directory_Node getNodeByName(String filePath, String fileName) {
        String[] pathParts = filePath.split("\\\\");
        Directory_Node currentNode = rootDirectory_Node;
        // 遍历路径部分，找到对应的目录节点
        for (String part : pathParts) {
            if (part.equals("C盘")) {
                continue; // 跳过根节点
            }
            boolean found = false;
            for (Directory_Node child : currentNode.getChildrens()) {
                if (new String(child.getFile_Name(), 0, 3).trim().equals(part)) {
                    currentNode = child;
                    found = true;
                    break;
                }
            }
            if (!found) {
                return null; // 如果路径无效，返回 null
            }
        }
        // 查找文件或文件夹节点
        for (Directory_Node child : currentNode.getChildrens()) {
            if (new String(child.getFile_Name(), 0, 3).trim().equals(fileName)) {
                return child;
            }
        }
        return null; // 未找到文件或文件夹
    }

    //获取当前节点
    public static  Directory_Node getNodeInDirectory(String filePath) {
        String[] pathParts = filePath.split("\\\\");
        Directory_Node currentNode = rootDirectory_Node;
        // 遍历路径部分，找到对应的目录节点
        for (String part : pathParts) {
            if (part.equals("C盘")) {
                continue; // 跳过根节点
            }
            boolean found = false;
            for (Directory_Node child : currentNode.getChildrens()) {
                if (new String(child.getFile_Name(), 0, 3).trim().equals(part)) {
                    currentNode = child;
                    found = true;
                    break;
                }
            }
            if (!found) {
                return null;   // 如果路径无效直接剪枝条
            }
        }
        return currentNode;
    }

}